Reference
- 문제 출처 - HackerRank
- 파이썬 연습 - Practice - Python
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다
HackerRank
Subdomain
- ~~Introduction~~
- ~~Basic Data Types~~
- ~~Strings~~
- ~~Sets~~
- ~~Math~~
- ~~Itertools~~
- ~~Collections~~
- ~~Date and Time~~
- ~~Errors and Exceptions~~
- ~~Classes~~
- ~~Built-Ins~~
- ~~Python Functionals~~
- <strong style="color:blue">Regex and Parsing</strong>
- XML
- Closures and Decorators
- Numpy
- Debugging
Regex and Parsing
Detect Floating Point Number
문제 : 입력이 형식에 맞는지 확인하는 문제
입력 : 입력받을 개수 N; (N 반복) 문자열;
출력 : 각 문자열이 형식에 맞는지 True/False 로 출력
형식 :
- 숫자는 +/-/. 으로 시작 할 수 있다
- 숫자는 최소 1개의 소수점 아래 값을 가진다(즉, 정수가 아님)
- float() 타입으로 변환할 때 오류가 없어야 한다
정규표현식 기호를 잘 외우자
''' |
Re.split()
문제 : 쉼표나 점을 구분하는 정규표현식
그냥 내장함수로도 구현할 수 있지 않나?
print(\*input().replace(',', '.').split('.'), sep='\n') |
어쨌든 정규표현식을 사용하면 다음과 같다
regex_pattern = r'[\.\,]' |
Group(), Groups() & Groupdict()
문제 : 처음으로 연속 반복되는 영문자 혹은 숫자를 출력하는 문제
입력 : 문자열
출력 : 반복되는 첫 영숫자(없다면 -1 출력)
예제 : .은 반복되지만 영숫자(alphanumeric)가 아님, 111이 반복되므로 답은 1
3가지 표현이 가능함
import re |
Re.findall() & Re.finditer()
문제 : 문자열에서 양끝이 자음(consonant)이면서 2개의 모음(vowel)을 포함하는 서브 문자열을 찾는 문제
입력 : 공백, +, - 를 포함하는 문자열
출력 : 조건을 만족하는 문자열
모범 답안
조건이 있는 표현식(?<=
와 같은) 을 잘 숙지할 것
컴파일 옵션으로 re.IGNORECASE
를 사용하여 대소문자를 구분하지 않아도 됨
import re |
Re.start() & Re.end()
문제 : 찾는 문자열의 위치(범위)를 출력하는 문제
입력 : 문자열 S; 찾고자 하는 문자열 k;
출력 : S에서 k문자열의 위치들
조금 비효율적인 방법인 것 같다ㅠ
import re |
조금 정리한 버전
import re |
Regex Substitution
문제 : 기호를 문자로 바꾸는 문제 (&& → and, || → or)
입력 : 입력줄 수 N; (N 반복) 문자열;
출력 : 바뀐 문자열
11
a = 1;
b = input();
if a + b > 0 && a - b < 0:
start()
elif a*b > 10 || a/b < 1:
stop()
print set(list(a)) | set(list(b))
#Note do not change &&& or ||| or & or |
#Only change those ‘&&’ which have space on both sides.
#Only change those ‘|| which have space on both sides.
a = 1;
b = input();
if a + b > 0 and a - b < 0:
start()
elif a*b > 10 or a/b < 1:
stop()
print set(list(a)) | set(list(b))
#Note do not change &&& or ||| or & or |
#Only change those ‘&&’ which have space on both sides.
#Only change those ‘|| which have space on both sides.
해당 단원에서는 정규식 사용해서 푸는 것을 권장하지만, 이 문제는 굳이 사용하지 않아도 될 것 같다
for \_ in range(int(input())): |
앞뒤 빈칸을 신경써서 문제를 풀어야한다… 그냥 위 방식이 더 깔끔한 것 같다
import re |
Validating Roman Numerals
문제 : 로마숫자가 4000보다 작은지 확인하는 문제
입력 : 로마숫자
출력 : True/False
로마숫자 모듈이 존재한다는 것을 처음 알았다
from roman import fromRoman |
rf''
이렇게도 작성이 가능하구나… 그냥 적어봤는데 에러가 안 나서 신기했다
thousand = 'M{0,3}' |
Validating phone numbers
문제 : 7,8,9 로 시작하며 10자리인 전화번호를 구분하는 문제
입력 : 번호 개수 N; (N 반복) 문자열;
출력 : Yes/No
import re |
Validating and Parsing Email Addresses
문제 : 양식에 맞는 이메일만 구별해서 출력
입력 : 이메일 개수 n; (n 반복) 이름, 이메일 주소;
출력 : name user@email.com 형식
그냥 정규식만 사용
import re |
email.utils 모듈 사용
import re |